﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web;
using System.Web.Http;
using WebShopAPI.Models; //前端模型类放置命令空间
namespace WebShopAPI.Controllers
{
    /// <summary>
    ///  自己写的上传文件 web api
    ///  本功能如果也要授权 继承web api控制器基类,不需要继承apicontroller
    /// </summary>
    public class UploadController : ApiController
    {
        #region  1 文件上传思想1 利用表单中的  文件域 来传数据
        public ResponData Post()
        {
            var msg = "";
            string _toServerPicturePath = "";//文件名
           //接收表单传递过来的图片，需要限定上传的图片格式：".JPG", ".JPEG", ".GIF", ".PNG", ".BMP" 
            var file = HttpContext.Current.Request.Files[0];
            //检查文件是否被预览选中,判断方式：通过判断文件名是否为空或者空字符串
            ResponData rd = new ResponData();  //响应对象，构建在这
            
            if (!string.IsNullOrWhiteSpace(file.FileName))
            {
                //限定上传图片的格式类型
                string[] LimitPictureType = { ".JPG", ".JPEG", ".GIF", ".PNG", ".BMP" };
                //当图片上被选中时，拿到文件的扩展名
                string currentPictureExtension = Path.GetExtension(file.FileName).ToUpper();
             
                //此处对图片上传的类型进行限定操作
                if (LimitPictureType.Contains(currentPictureExtension))
                {
                    //此处标记图片上传至服务器的唯一新名称
                    string _newFileName = Guid.NewGuid().ToString();
                    _toServerPicturePath = DateTime.Now.Year + "/" + DateTime.Now.Month + "/";
                    //upload 根目录下下的文件夹，需要新创建
                    string _dbPicturePath = "upload/" + _toServerPicturePath + _newFileName + currentPictureExtension;
                    // AppDomain.CurrentDomain.BaseDirectory获取应用程序路径
                    _toServerPicturePath = AppDomain.CurrentDomain.BaseDirectory + "upload/" + _toServerPicturePath;
                    //最终生成的文件名：+_newFileName +currentPictureExtension

                    //首先判断图片上传至服务的路径是否存在，不存在则创建并执行保存操作，存在则直接保存
                    if (Directory.Exists(_toServerPicturePath))
                    {
                        //最终上传的文件路径全名
                        _toServerPicturePath = _toServerPicturePath + _newFileName + currentPictureExtension;
                    }
                    else
                    {
                         //不存在此路径，则创建后执行保存操作
                        Directory.CreateDirectory(_toServerPicturePath);
                        _toServerPicturePath = _toServerPicturePath + _newFileName + currentPictureExtension;
                    }
                    
                    //执行保存图片，并插入数据库操作
                    file.SaveAs(HttpContext.Current.Server.MapPath("~/" + _dbPicturePath));
                    //Request.Url.Scheme+“://”+Request.Url.Host
                    rd.data = new
                    {
                        tmp_path = _dbPicturePath, //第一个属性服务端相对路径
                        url = "http://"+ HttpContext.Current.Request.Url.Host +":"
                        + HttpContext.Current.Request.Url.Port+"/"+ _dbPicturePath  
                        //加上网站域名+端口，前后端分离需要绝对网上访问路径

                    };//这里给对象赋值

                    ////执行数据库相关操作，没有异常则代码继续执行，否则跳出
                    msg = "图片上传操作成功！";
                }
                else
                {
                    msg = "图片上传操作失败，请选择扩展名为：.JPG, .JPEG, .GIF, .PNG, .BMP 等类型图片。";
                }
            }
            else
            {
                msg = "图片上传操作失败，图片没有被选中！";
            }
            //////////////////////////
         
            //根据前端要求返回路径
           
            rd.meta.msg = msg;
            rd.meta.status = 200;
            return rd;
        }
        #endregion

        //#region 2 上传文件理论：ES5 中可以使用Formdata上传文件 了解一下formdata ,本项目暂时不用
        //public ResponData Upload2()
        //{
        //    //检查是否是 multipart/form-data 
        //    if (!Request.Content.IsMimeMultipartContent())
        //    {
        //        throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
        //    }

        //    //设置上传目录
        //    string root = HttpContext.Current.Server.MapPath("~/upload");
        //    var provider = new MultipartFormDataStreamProvider(root);

        //    try
        //    {
        //        //读取form data.
        //         Request.Content.ReadAsMultipartAsync(provider);

        //        string urlPic = string.Empty;
        //        foreach (var file in provider.FileData)
        //        {
        //            //这里获取含有双引号'" '
        //            string filename = file.Headers.ContentDisposition.FileName.Trim('"');
        //            //获取对应文件后缀名
        //            string fileExt = filename.Substring(filename.LastIndexOf('.'));

        //            FileInfo fileinfo = new FileInfo(file.LocalFileName);
        //            //fileinfo.Name 上传后的文件路径 此处不含后缀名 
        //            //修改文件名 添加后缀名
        //            string fname = DateTime.Now.ToString("yyyyMMddHHmmss_ffff", DateTimeFormatInfo.InvariantInfo);
        //            //string newFilename = fileinfo.Name + fileExt;默认文件名guid生成
        //            string newFilename = fname + fileExt;
        //            //最后保存文件路径
        //            string saveUrl = Path.Combine(root, newFilename);
        //            fileinfo.MoveTo(saveUrl);
        //            urlPic += "/upload/" + newFilename;
        //        }
        //        // 获取表单 key-value.
        //        //foreach (var key in provider.FormData.AllKeys)
        //        //{
        //        //    foreach (var val in provider.FormData.GetValues(key))
        //        //    {
        //        //        str+=string.Format("{0}: {1}", key, val);
        //        //    }
        //        //}
        //        if (!string.IsNullOrEmpty(urlPic))
        //        {
        //            dynamic data = new { status = true, url = urlPic };
        //            return Json<dynamic>(data);
        //        }
        //        else
        //        {
        //            dynamic data = new { status = false, message = "上传失败" };
        //            return Json<dynamic>(data);
        //        }
        //    }
        //    catch
        //    {
        //        dynamic data = new { status = false, message = "上传失败" };
        //        return Json<dynamic>(data);
        //    }

        //    ////////////////////////////////
        //    ResponData rd = new ResponData();
        //    return rd;
        //}
        //#endregion
    }
}
